package edu.ncsu.dlf.database;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.WriteResult;
import edu.ncsu.dlf.model.Repo;
import edu.ncsu.dlf.model.Review;
import org.eclipse.egit.github.core.User;
public class MongoDB implements DBAbstraction {
private final String DB_NAME;
private MongoClient mongoClient;
public MongoDB() throws IOException {
String portNumber = System.getenv("OPENSHIFT_MONGODB_DB_PORT");
ServerAddress address = new ServerAddress(System.getenv("OPENSHIFT_MONGODB_DB_HOST"),
Integer.parseInt(portNumber));
String user = System.getenv("OPENSHIFT_MONGODB_DB_USERNAME");
String password = System.getenv("OPENSHIFT_MONGODB_DB_PASSWORD");
DB_NAME = System.getenv("MONGO_DB_NAME");
MongoCredential credential = MongoCredential.createCredential(user, DB_NAME, password.toCharArray());
this.mongoClient = new MongoClient(address, Arrays.asList(credential));
}
@Override
public List<Review> getReviewsWhereUserIsRequester(User user) {
return findRequests(user, "Requester");
}
@Override
public List<Review> getReviewsWhereUserIsReviewer(User user) {
return findRequests(user, "Reviewer");
}
private List<Review> findRequests(User userToLookFor, String roleOfUser) {
List<Review> retVal = new ArrayList<>();
DB db = mongoClient.getDB(DB_NAME);
DBCollection coll = db.getCollection(DB_NAME);
coll.setObjectClass(Review.class);
BasicDBObject query = new BasicDBObject(roleOfUser +".Login", userToLookFor.getLogin());
DBCursor cursor = coll.find(query);
try {
while (cursor.hasNext()) {
DBObject element = cursor.next();
retVal.add((Review) element);
}
} finally {
cursor.close();
}
return retVal;
}
@Override
public void addReviewToDatastore(Review newReview) {
DB db = mongoClient.getDB(DB_NAME);
DBCollection coll = db.getCollection(DB_NAME);
coll.save(newReview);
}
@Override
public void removeReviewFromDatastore(String reviewer, Repo repo) {
DB db = mongoClient.getDB(DB_NAME);
DBCollection coll = db.getCollection(DB_NAME);
BasicDBObject query = new BasicDBObject("Reviewer.Login", reviewer).
append("Repo.RepoOwner", repo.repoOwner).
append("Repo.RepoName", repo.repoName);
WriteResult result = coll.remove(query);
System.out.println(result.getN() +" documents removed");
}
@Override
public Review findReview(String reviewerLogin, Repo repo) {
DB db = mongoClient.getDB(DB_NAME);
DBCollection coll = db.getCollection(DB_NAME);
coll.setObjectClass(Review.class);
BasicDBObject query = new BasicDBObject("Reviewer.Login", reviewerLogin).
append("Repo.RepoOwner", repo.repoOwner).
append("Repo.RepoName", repo.repoName);
return (Review) coll.findOne(query);
}
}